home *** CD-ROM | disk | FTP | other *** search
/ APDL Other Worlds / APDL Other Worlds Collection.iso / SF3000 / Extras / !FednetCmp / c / SaveDir < prev    next >
Encoding:
Text File  |  2003-10-16  |  10.2 KB  |  296 lines

  1. /*
  2.  *  FednetCmp - Fednet file compression/decompression 
  3.  *  Directory savebox
  4.  *  Copyright (C) 2001  Chris Bazley
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public Licence as published by
  8.  *  the Free Software Foundation; either version 2 of the Licence, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public Licence for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public Licence
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20.  
  21. /* ANSI library files */
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <string.h>
  25.  
  26. /* RISC OS library files */
  27. #include "toolbox.h"
  28. #include "event.h"
  29. #include "saveas.h"
  30. #include "window.h"
  31. #include "gadgets.h"
  32.  
  33. /* My library files */
  34. #include "err.h"
  35. #include "msgtrans.h"
  36. #include "Macros.h"
  37. #include "Loader.h"
  38. #include "ViewsMenu.h"
  39. #include "TboxBugs.h"
  40.  
  41. /* Local headers */
  42. #include "Main.h"
  43. #include "Utils.h"
  44. #include "Scan.h"
  45. #include "SaveDir.h"
  46.  
  47. /* gadget IDs */
  48. #define SAVEDIR_RADIO_COMP       0x01
  49. #define SAVEDIR_RADIO_DECOMP     0x02
  50. #define SAVEDIR_COMPFILETYPE     0x12
  51. #define SAVEDIR_FILETYPELAB      0x11
  52.  
  53. typedef struct _SaveDirBlk
  54. {
  55.   ObjectId    saveas_id;
  56.   ObjectId    window_id;
  57.   char       *input_path;
  58. #ifndef SAVEAS_CRAP
  59.   char       *reset_file_name;
  60. #endif
  61.   ComponentId reset_direction;
  62.   char        reset_filetype[32];
  63. } SaveDirBlk;
  64.  
  65. /* ----------------------------------------------------------------------- */
  66. /*                       Function prototypes                               */
  67.  
  68. static ToolboxEventHandler _SaveDir_deletedhandler, _SaveDir_savehandler, _SaveDir_buttonshandler, _SaveDir_radiohandler;
  69.  
  70. /* ----------------------------------------------------------------------- */
  71. /*                         Public functions                                */
  72.  
  73. ObjectId SaveDir_create(char *inputpath)
  74. {
  75.   SaveDirBlk *newblk;
  76.  
  77.   /* Grab memory */
  78.   newblk = malloc(sizeof(SaveDirBlk));
  79.   if(newblk == NULL)
  80.     MG_RETV("NoMem", NULL_ObjectId) /* failure */
  81.  
  82.   /* Copy directory path to scan */
  83.   newblk->input_path = copystring(inputpath);
  84.   if(newblk->input_path == NULL)
  85.     goto errexit1;
  86. #ifndef SAVEAS_CRAP
  87.   newblk->reset_file_name = NULL;
  88. #endif
  89.  
  90.   /* Create object */
  91.   if(E(toolbox_create_object(0, "SaveDir", &newblk->saveas_id)))
  92.     goto errexit2;
  93.   if(E(saveas_get_window_id(0, newblk->saveas_id, &newblk->window_id)))
  94.     goto errexit3;
  95.  
  96.   /* Store default settings */
  97. #ifndef SAVEAS_CRAP
  98.   newblk->reset_file_name = copystring(inputpath);
  99.   if(newblk->reset_file_name == NULL)
  100.     goto errexit3;
  101. #endif
  102.   if(E(radiobutton_get_state(0, newblk->window_id, SAVEDIR_RADIO_COMP, NULL, &newblk->reset_direction)))
  103.     goto errexit3;
  104.   if(E(stringset_get_selected(0, newblk->window_id, SAVEDIR_COMPFILETYPE, &newblk->reset_filetype, sizeof(newblk->reset_filetype), NULL)))
  105.     goto errexit3;
  106.  
  107.   /* Add entry to iconbar menu */
  108.   if(E(ViewsMenu_add(newblk->saveas_id, msgs_lookup_sub1("DirDialogueList", tail(inputpath, 3)), inputpath)))
  109.     goto errexit3;
  110.  
  111.   /* Set up window */
  112.   if(E(saveas_set_file_name(0, newblk->saveas_id, inputpath))
  113.   || E(saveas_set_file_type(0, newblk->saveas_id, FILETYPE_DIR)))
  114.     goto errexit4;
  115.  
  116.   /* Register Toolbox event handlers
  117.      Note that ObjectDeleted handler is registered AFTER anything that could cause an error and therefore premature deletion!
  118. */
  119.   if(!E(event_register_toolbox_handler(newblk->saveas_id, SaveAs_SaveToFile,  _SaveDir_savehandler, newblk))
  120.   && !E(event_register_toolbox_handler(newblk->saveas_id, SaveAs_DialogueCompleted,  delete_object_handler, newblk))
  121.   && !E(event_register_toolbox_handler(newblk->window_id, ActionButton_Selected, _SaveDir_buttonshandler, newblk))
  122.   && !E(event_register_toolbox_handler(newblk->window_id, RadioButton_StateChanged, _SaveDir_radiohandler, newblk))
  123.   && !E(event_register_toolbox_handler(newblk->saveas_id, Toolbox_ObjectDeleted,  _SaveDir_deletedhandler, newblk)))
  124.     return newblk->saveas_id; /* success! */
  125.  
  126.   errexit4:
  127.     RE(ViewsMenu_remove(newblk->saveas_id))
  128.   errexit3:
  129.     RE(toolbox_delete_object(0, newblk->saveas_id))
  130.   errexit2:
  131. #ifndef SAVEAS_CRAP
  132.     free(newblk->reset_file_name);
  133. #endif
  134.     free(newblk->input_path);
  135.   errexit1:
  136.     free(newblk);
  137.     return NULL_ObjectId; /* failure */
  138. }
  139.  
  140. /* ----------------------------------------------------------------------- */
  141. /*                         Private functions                               */
  142.  
  143. /*
  144.  * Toolbox event handlers
  145.  */
  146.  
  147. static int _SaveDir_buttonshandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
  148. {
  149.   ActionButtonSelectedEvent *abse = (ActionButtonSelectedEvent *)event;
  150.   SaveDirBlk *blk = (SaveDirBlk *)handle;
  151.  
  152.   if(!FLAG_SET(abse->hdr.flags, ActionButton_Selected_Adjust))
  153.     return 0; /* not interested */
  154.  
  155.   switch(id_block->self_component) {
  156.     case 0x82bc02: /* Cancel button */
  157.       /* Reset dbox state */
  158. #ifndef SAVEAS_CRAP
  159.       if(blk->reset_file_name != NULL)
  160.         RE(saveas_set_file_name(0, blk->saveas_id, blk->reset_file_name))
  161. #else
  162.       RE(saveas_set_file_name(0, blk->saveas_id, blk->input_path))
  163. #endif
  164.       RE(radiobutton_set_state(0, id_block->self_id, blk->reset_direction, 1))
  165.       RE(stringset_set_selected(0, id_block->self_id, SAVEDIR_COMPFILETYPE, blk->reset_filetype))
  166.  
  167.       /* Ensure that gadgets are greyed out/ungreyed correctly */
  168.       {
  169.         IdBlock fake_id = *id_block;
  170.         fake_id.self_component = blk->reset_direction;
  171.         _SaveDir_radiohandler(event_code, event, &fake_id, handle);
  172.       }
  173.       break;
  174.  
  175. #ifndef SAVEAS_CRAP /* no point saving state if dbox closes anyway */
  176.     case 0x82bc03: /* Save button */
  177.       /* Additional dbox state saving (stringset and radio buttons are read on save) */
  178.       int len;
  179.       E_RETV(saveas_get_file_name(0, blk->saveas_id, NULL, 0, &len), 1)
  180.       free(blk->reset_file_name);
  181.       blk->reset_file_name = malloc(len+1);
  182.       if(blk->reset_file_name == NULL)
  183.         err_complain(255, msgs_global("NoMem"));
  184.       else
  185.         RE(saveas_get_file_name(0, blk->saveas_id, blk->reset_file_name, len, NULL))
  186.       break;
  187. #endif
  188.  
  189.     default:
  190.       return 0; /* unknown component */
  191.   }
  192.  
  193.   return 1; /* claim event */
  194. }
  195.  
  196. /* ----------------------------------------------------------------------- */
  197.  
  198. static int _SaveDir_radiohandler(int event_code, ToolboxEvent *event, IdBlock *id_block,void *handle)
  199. {
  200.   /* Handles greying/ungreying of filetype gadgets */
  201.   unsigned int flags1, flags2;
  202.  
  203.   E_RETV(gadget_get_flags(0, id_block->self_id, SAVEDIR_COMPFILETYPE, &flags1), 1)
  204.   E_RETV(gadget_get_flags(0, id_block->self_id, SAVEDIR_FILETYPELAB, &flags2), 1)
  205.   if(id_block->self_component == SAVEDIR_RADIO_COMP) {
  206.     /* set unfaded */
  207.     flags1 = flags1 & ~Gadget_Faded;
  208.     flags2 = flags2 & ~Gadget_Faded;
  209.   }
  210.   else {
  211.     /* set faded */
  212.     flags1 = flags1 | Gadget_Faded;
  213.     flags2 = flags2 | Gadget_Faded;
  214.   }
  215.   RE(gadget_set_flags(0, id_block->self_id, SAVEDIR_COMPFILETYPE, flags1))
  216.   RE(gadget_set_flags(0, id_block->self_id, SAVEDIR_FILETYPELAB, flags2))
  217.  
  218.   return 1; /* claim event */
  219. }
  220.  
  221. /* ----------------------------------------------------------------------- */
  222.  
  223. static int _SaveDir_savehandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
  224. {
  225.   SaveAsSaveToFileEvent *save_to_file_block = (SaveAsSaveToFileEvent *)event;
  226.   SaveDirBlk *blk = (SaveDirBlk *)handle;
  227.   unsigned int flags = 0;
  228.  
  229.   /* For the moment we just create the root directory */
  230.   if(!ViewsMenu_strcmp_nc(save_to_file_block->filename, "<Wimp$Scrap>")) {
  231.     _kernel_osfile_block kosfb;
  232.     kosfb.start = 0; /* default number of entries */
  233.     if(_kernel_osfile(8, save_to_file_block->filename, &kosfb) == _kernel_ERROR) {
  234.       _kernel_oserror *e = _kernel_last_oserror();
  235.       err_report(e->errnum, msgs_lookup_sub1("DirFail", e->errmess));
  236.     } else
  237.       flags = 1; /* success */
  238.   } else
  239.     M("NoDirtoApp");
  240.  
  241.   if(flags == 1) {
  242.     /* N.B. Bizarrely, the underlying window may have been deleted by the time we receive a SaveAs_SaveCompleted event - so we must do our business here. */
  243.   
  244.     /* Read conversion operation from radio buttons */
  245.     if(E(radiobutton_get_state(0, blk->window_id, SAVEDIR_RADIO_COMP, NULL, &blk->reset_direction)))
  246.       goto exit;
  247.   
  248.     /* Read filetype to give output */
  249.     if(E(stringset_get_selected(0, blk->window_id, SAVEDIR_COMPFILETYPE, &blk->reset_filetype, sizeof(blk->reset_filetype), NULL)))
  250.       goto exit;
  251.     int hextype;
  252.     sscanf(strchr(blk->reset_filetype, '('), "(&%x)",&hextype);
  253.   
  254.     /* Create new Scan object */
  255.     char *buf;
  256.     if(E(loader_canonicalise(&buf, NULL, NULL, save_to_file_block->filename)))
  257.       goto exit;
  258.     ObjectId batchid = Scan_create(blk->input_path, buf, (blk->reset_direction == SAVEDIR_RADIO_COMP), hextype);
  259.     free(buf);
  260.     if(batchid != NULL_ObjectId)
  261.       RE(toolbox_show_object(0, batchid, Toolbox_ShowObject_Centre, NULL, id_block->self_id, id_block->self_component))
  262.   }
  263.  
  264. exit:
  265.   saveas_file_save_completed(flags, id_block->self_id, save_to_file_block->filename);
  266.   return 1; /* claim event */
  267. }
  268.  
  269. /* ----------------------------------------------------------------------- */
  270.  
  271. static int _SaveDir_deletedhandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
  272. {
  273.   SaveDirBlk *blk = (SaveDirBlk *)handle;
  274.  
  275.   /* deregister handlers */
  276.   RE(event_deregister_toolbox_handler(id_block->self_id, SaveAs_SaveToFile,  _SaveDir_savehandler, handle))
  277.   RE(event_deregister_toolbox_handler(id_block->self_id, SaveAs_DialogueCompleted,  delete_object_handler, handle))
  278.   RE(event_deregister_toolbox_handler(blk->window_id, ActionButton_Selected, _SaveDir_buttonshandler, handle))
  279.   RE(event_deregister_toolbox_handler(blk->window_id, RadioButton_StateChanged, _SaveDir_radiohandler, handle))
  280.   RE(event_deregister_toolbox_handler(id_block->self_id, Toolbox_ObjectDeleted,  _SaveDir_deletedhandler, handle))
  281.  
  282.   RE(ViewsMenu_remove(id_block->self_id))
  283.  
  284.   /* free memory */
  285. #ifndef SAVEAS_CRAP
  286.   free(blk->reset_file_name);
  287. #endif
  288.   free(blk->input_path);
  289.   free(blk);
  290.  
  291.   if(last_savebox == id_block->self_id)
  292.     last_savebox = NULL;
  293.  
  294.   return 1; /* claim event */
  295. }
  296.